'''
@Project ：my_python_project 
@File    ：叠加装饰器、.py
@IDE     ：PyCharm 
@Author  ：xionglinhui
@Date    ：2024/8/20 上午8:19 
'''

def deco1(func1): #func1 = wrapper2的内存地址
    def wrapper1(*args, **kwargs):
        print('正在运行===>deco1.wrapper1')
        res1 = func1(*args, **kwargs)
        print('已结束===>deco1.wrapper1')
        return res1
    return wrapper1

def deco2(func2): # func2 = wrapper3的内存地址
    def wrapper2(*args, **kwargs):
        print('正在运行===>deco2.wrapper2')
        res2 = func2(*args, **kwargs)
        print('已结束===>deco2.wrapper2')
        return res2
    return wrapper2

def deco3(x): # @deco3(111)==>得到了outter函数的内存地址，@+outter语法，含义是通过调用outter函数将正下方的函数地址传入，得到的返回值赋值给原函数名
    def outter(func3):    # index = outter(index),故func3=被装饰对象index函数的内存地址
        def wrapper3(*args, **kwargs):
            print('正在运行===>deco3.wrapper3')
            res3 = func3(*args, **kwargs)
            print('已结束===>deco3.wrapper3')
            return res3
        return wrapper3
    return outter

#加载顺序：自下而上（了解）
@deco1          #1、@deco1 等价于==>index=deco1(wrapper2的内存地址)=wrapper1的内存地址，即index=wrapper1的内存地址
@deco2          #1、@deco2 等价于==>index=deco2(wrapper3的内存地址)=wrapper2的内存地址，即index=wrapper2的内存地址
@deco3(111)     #1、deco3(111)等价于==> index = outter  2、@outter 等价于==> index = outter3(func)= wrapper3的内存地址 ，即index = wrapper3的内存地址
def index(x,y):
    print('from index %s:%s' %(x,y))
    return '我是最原始的index'


'''综上所述，index函数的内存地址被换成了wrapper1函数的内存地址，打印index查看'''
print(index)   # >输出：<function deco1.<locals>.wrapper1 at 0x7f409d9e01e0>



a = index(666,888)  # 等价==>wrapper1(666, 888)
print('=**==**==**==**==**==**=')
print(a)